
package org.TCC_NOVO.client.visual;

import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.data.Record;
import com.gwtext.client.data.SimpleStore;
import com.gwtext.client.data.Store;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.Window;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.form.ComboBox;
import com.gwtext.client.widgets.form.DateField;
import com.gwtext.client.widgets.form.FormPanel;
import com.gwtext.client.widgets.form.HtmlEditor;
import com.gwtext.client.widgets.form.TextArea;
import com.gwtext.client.widgets.form.TextField;
import com.gwtext.client.widgets.layout.AnchorLayoutData;
import java.util.List;

import org.TCC_NOVO.client.GWTServiceAsync;
import org.TCC_NOVO.client.modelo.Projeto;
import org.TCC_NOVO.client.modelo.Usuario;

public class ProjetosForm extends Window{

    ProjetosPanel ProjPanel;
    int IDF_Usuario = 0;
    private final GWTServiceAsync controller;

    FormPanel formPanel;
    Panel panelPrin;
    TextField txtNome;
    TextField txtAssunto;
    DateField dataIni;
    DateField dataEntr;
    TextArea area;
    String ID_Form;
    HtmlEditor htmlEditor;
    ComboBox cb;
    boolean edit;
    Record record;

    public ProjetosForm(ProjetosPanel ProjPanel, GWTServiceAsync controller, int IDF_Usua) {
        this.ProjPanel = ProjPanel;
        this.IDF_Usuario = IDF_Usua;
        this.controller = controller;
        this.init();
        this.setModal(true);
    }

    private void init(){
        panelPrin = getPanelCentral();
        this.add(panelPrin);
        this.setTitle("Cadastro de Projetos");
    }

    private class CallBackRetProjetos implements AsyncCallback<Integer> {
	public void onFailure(Throwable e) {
            MessageBox.alert("Erro ao carregar dados... ", e.getMessage());
	}
	public void onSuccess(Integer result) {
            //ProjPanel.matPanelWin.IDF_Proj = result;
            ProjPanel.ID_ProjAtual = result;
        }
    }

    private Panel getPanelCentral(){
        Panel panel = new Panel();
        panel.setBorder(false);
        panel.setPaddings(1);

        formPanel = new FormPanel();
        formPanel.setFrame(true);
        formPanel.setWidth(625);
        formPanel.setLabelWidth(105);

        txtNome = new TextField("Nome", "Nome", 380);
        //txtNome.setAllowBlank(false);
        txtNome.setBlankText("Este campo é obrigatório");
        formPanel.add(txtNome);

        txtAssunto = new TextField("Assunto", "Assunto", 380);
        txtAssunto.setHeight(txtAssunto.getHeight()+60);
        txtAssunto.setVisible(false);
        //formPanel.add(txtAssunto);

        area = new TextArea("Assunto", "Assunto");
        area.setSize(380, 70);
        formPanel.add(area);

        int ID = 0;
        final Store store = new SimpleStore(ID, new String[]{"ID", "conteudista"}, getUsuarios());
        store.load();

        cb = new ComboBox();
        cb.setForceSelection(true);
        cb.setMinChars(1);
        cb.setFieldLabel("Conteudista Resp.");
        cb.setStore(store);
        cb.setDisplayField("conteudista");
        cb.setValueField("ID");
        cb.setMode(ComboBox.LOCAL);
        cb.setTriggerAction(ComboBox.ALL);
        cb.setEmptyText("Selecione o Conteudista Responsável");
        cb.setLoadingText("Searching...");
        cb.setTypeAhead(true);
        cb.setSelectOnFocus(true);
        cb.setWidth(240);
        cb.setHideTrigger(false);
        cb.setName("Conteudista");
        formPanel.add(cb);

        dataIni = new DateField("Data Inicio", "DataInicio", 160);
        //dataIni.setAllowBlank(false);
        dataIni.setBlankText("Este campo é obrigatório");
        dataIni.setEmptyText("Data Inicio Projeto");
        dataIni.setFormat("d/m/y");
        formPanel.add(dataIni);

        dataEntr = new DateField("Data Entrega", "DataEntrega", 160);
        //dataEntr.setAllowBlank(false);
        dataEntr.setBlankText("Este campo é obrigatório");
        dataEntr.setEmptyText("Data Prazo Entrega");
        dataEntr.setFormat("d/m/y");
        formPanel.add(dataEntr);

        //add a HtmlEditor below the 2-column top panel
        htmlEditor = new HtmlEditor("Observações", "Observacoes");
        htmlEditor.setHeight(120);
        formPanel.add(htmlEditor, new AnchorLayoutData("100%"));

        final AsyncCallback callbackProjeto = new AsyncCallback() {
            public void onSuccess(Object result) {
                //MessageBox.alert("Registro Gravado com Sucesso!");
            }
            public void onFailure(Throwable caught) {
               MessageBox.alert("Erro ", caught.getMessage()); }
        };

        final Button save = new Button();
        save.setText(" Salvar");
        save.setIcon("Images/salvar.png");
        save.setTooltip("Salvar");
        save.addListener(new ButtonListenerAdapter(){
            @Override
            public void onClick(Button button, EventObject e){
                  if (cb.getValue() == null ){
                      MessageBox.alert("Conteudista responsável deve ser preenchido!");
                  }else{
                      if (dataIni.getValue() == null || dataEntr.getValue() == null){
                         MessageBox.alert("Data Inicio e data prazo entrega devem ser preenchidas!");
                      }else{
                        Projeto proj = getProjetoForm();
                        String sSql;
                        /*ConvDate conDta = new ConvDate();
                        String dia_Ini = proj.getDataIni().substring(0,2);
                        String mes_Ini = proj.getDataIni().substring(3,5);
                        String ano_Ini = proj.getDataIni().substring(6,10);
                        String dia_Ent = proj.getDataEnt().substring(0,2);
                        String mes_Ent = proj.getDataEnt().substring(3,5);
                        String ano_Ent = proj.getDataEnt().substring(6,10);
*/
                        DateTimeFormat sdf = DateTimeFormat.getFormat("yyyy-MM-dd");

                        if (edit){
                            sSql = "Update Projeto set Nome = '"+proj.getNome()+"' where ID = '"+ID_Form+"'";
                            controller.EditarRegistro(sSql, callbackProjeto);
                            sSql = "Update Projeto set Assunto = '"+proj.getAssunto()+"' where ID = '"+ID_Form+"'";
                            controller.EditarRegistro(sSql, callbackProjeto);
                            sSql = "Update Projeto set Data_Inicio = '"+sdf.format(proj.getDataIni())+"' where ID = '"+ID_Form+"'";
                            controller.EditarRegistro(sSql, callbackProjeto);
                            sSql = "Update Projeto set Data_Entrega = '"+sdf.format(proj.getDataEnt())+"' where ID = '"+ID_Form+"'";
                            controller.EditarRegistro(sSql, callbackProjeto);
                            sSql = "Update Projeto set Observacoes = '"+proj.getObserv()+"' where ID = '"+ID_Form+"'";
                            controller.EditarRegistro(sSql, callbackProjeto);

                            updateProjeto();
                            hide();
                            ProjPanel.CarregarGrid();
                        }else{
                            //Inclusao do registro no servidor (Banco de Dados)...
                            sSql = "insert into Projeto (Nome, Assunto, Data_Inicio, Data_Entrega, Observacoes, IDF_Usuario, IDF_Conteudista) values ('"+
                                proj.getNome()+"', '"+ proj.getAssunto()+"', '"+sdf.format(proj.getDataIni())+"', '"+
                                sdf.format(proj.getDataEnt()) +"', '"+ proj.getObserv()+"', "+ IDF_Usuario+", "+ cb.getValue()+ ")";
                              
                            //sSql = "insert into Projeto (Nome, Assunto, IDF_Usuario) values ('sdsd', 'sadsadasd', 9)";
                            controller.IncluirRegistro(sSql, new CallBackRetProjetos());
                            //Inclusao do registro no cliente (Grid)...
                            salvarProjeto(proj);                            
                            hide();
                        }
                        //ProjPanel.CarregarGrid();
                    }
                  }
            }
        });
        formPanel.addButton(save);

        final Button cancel = new Button();
        cancel.setText(" Cancelar");
        cancel.setIcon("Images/cancelar.png");
        cancel.setTooltip("Cancelar");
        cancel.addListener(new ButtonListenerAdapter(){
            public void onClick(Button button, EventObject e){
                MessageBox.confirm("Deseja realmente sair?", "Todos os dados não submetidos serão perdidos", new MessageBox.ConfirmCallback() {
                    @Override
                    public void execute(String btnID) {
                        if (btnID.equals("yes")){
                            hide();
                        }
                        throw new UnsupportedOperationException("Not supported yet.");
                    }
                });
            }
        });
        formPanel.addButton(cancel);
        
        panel.add(formPanel);
        return panel;
    }

    private Projeto getProjetoForm(){

        Projeto Proj = new Projeto();
        Proj.setNome(txtNome.getText());
        Proj.setAssunto(area.getValueAsString());
        Proj.setUsuarioResp(Integer.toString(IDF_Usuario));
        //Proj.setDataIni(dataIni.getValueAsString());
        Proj.setDataIni(dataIni.getValue());
        //Proj.setDataEnt(dataEntr.getValueAsString());
        Proj.setDataEnt(dataEntr.getValue());

        Proj.setObserv(htmlEditor.getValueAsString());
        return Proj;
    }

    private void salvarProjeto(Projeto proj){
        this.ProjPanel.addRecord(proj);
    }

    private void updateProjeto(){
        formPanel.getForm().updateRecord(record);
    }

    public void show(boolean edit){
        this.edit = edit;
        if (edit){
            initEdit();
        }else{
            initNew();
        }
        show();
    }

    private void initEdit(){
        txtNome.focus();
    }

    private void initNew(){
        area.setValue("");
        txtNome.setValue("");
        htmlEditor.setValue("");
        dataEntr.setValue("");
        dataIni.setValue("");
        ID_Form = "";
    }

    public void loadRecord(Record record){
        this.record = record;
        formPanel.getForm().loadRecord(record);
        formPanel.getForm().findField(dataIni.getName()).setValue(record.getAsString("DataInicio").substring(0, 3)+
                                                                  record.getAsString("DataInicio").substring(3, 6)+
                                                                  record.getAsString("DataInicio").substring(8, 10));
        formPanel.getForm().findField(dataEntr.getName()).setValue(record.getAsString("DataEntrega").substring(0, 3)+
                                                                  record.getAsString("DataEntrega").substring(3, 6)+
                                                                  record.getAsString("DataEntrega").substring(8, 10));
    }

    private String[][] getUsuarios() {
        List<Usuario> l = ProjPanel.getUsuarios();
        String[][] s = new String[l.size()][2];

        for (int x = 0; x < l.size(); x++) {
            s[x][0] = l.get(x).getId()+"";
            s[x][1] = l.get(x).getNick()+"";
        }
        return s;
    }

}
